package com.enterpriseDigitalPlatform.util;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.ThreadLocalRandom;

// import org.springframework.scheduling.annotation.Async;

//@Async //可加在类或方法，开启异步事件的支持
@Component
@Slf4j
@EnableAsync        // 2.开启多线程
@EnableScheduling
public class SchedulerTask {
    @Value("${isDev}")
    private String isDev;

    @Autowired
    private RedisUtil redisUtil;

    protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    // Cron表达式范例：
    // 每隔5秒执行一次：*/5 * * * * ?
    // 每隔1分钟执行一次：0 */1 * * * ?
    // 每天23点执行一次：0 0 23 * * ?
    // 每天凌晨1点执行一次：0 0 1 * * ?
    // 每月1号凌晨1点执行一次：0 0 1 1 * ?
    // 每月最后一天23点执行一次：0 0 23 L * ?
    // 每周星期天凌晨1点实行一次：0 0 1 ? * L
    // 在26分、29分、33分执行一次：0 26,29,33 * * * ?
    // 每天的0点、13点、18点、21点都执行一次：0 0 0,13,18,21 * * ?
    // cron表达式：在5,15,25,35,45,55分执行一次
    // todo 整理部门全称
    @Async
    @Scheduled(cron = "0 */10 * * * ?")
    public void makeParName() {
        // 使用分布式锁来实现 定时任务
        log.info("定时整理部门全称");
        if ("1".equals(isDev)) {
            log.info("本地开发环境定时任务不执行");
            return;
        }
        long startTime = System.currentTimeMillis();
        String lockKey = "makeParName";
        long timestamp = System.nanoTime(); // 或者 System.currentTimeMillis()
        String requestId = "dingshi-" + timestamp + "-" + ThreadLocalRandom.current().nextInt(1_000_000);
        boolean lockAcquired = redisUtil.tryLock(lockKey, requestId, 15 * 60); // 尝试获取锁，超时时间5分钟
        try {
            if (lockAcquired) {
                System.out.println("获取锁成功，执行定时任务");
                // 定时任务内容
                makeDept();
                System.out.println("定时任务执行完毕");
            } else {
                System.out.println("获取锁失败，不执行定时任务");
            }
        } finally {
            // 执行完 释放锁
            if (lockAcquired) {
                redisUtil.releaseLock(lockKey, requestId);
            }
        }
        log.info("定时整理部门全称耗时:{}毫秒", (System.currentTimeMillis() - startTime));
    }

    private void makeDept() {
        // List<Dept> list = deptMapper.getList(new SelectDept());
        // list.forEach(dept -> {
        //     dept.setParId(String.valueOf(dept.getId()));
        //     dept.setParName(dept.getName());
        //     TreeUtil.buildParName(list, dept.getPid(), dept);
        //     deptMapper.updatePar(dept);
        // });
    }

    // @Scheduled(cron = "0/10 * * * * ?")
    public void execute() {
        log.info("Scheduled task is running ... ...");
    }
 
}
